home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Magazin/MacEasy 32
/
Mac Magazin and MacEasy Magazine CD - Issue 32.iso
/
Multimedia
/
MIDI
/
MidiChaos_15 Folder
/
MidiChaos_1.5
/
Source
/
Voice
< prev
Wrap
Text File
|
1995-04-28
|
2KB
|
118 lines
\ This class uses chaotic_critters to generate and play midi information.
\
\ Author: Darren Gibbs Copyright 1990
\ Date: 10/3/90
ANEW TASK-VOICE
OB.OBJLIST VOICE-LIST
TEXTROM VOICE-NAMES ," VOICE-1 " ," VOICE-2 " ," VOICE-3" ," VOICE-4"
3 CONSTANT #PARAMS
0 CONSTANT NOTE
1 CONSTANT VELOCITY
2 CONSTANT DURATION
TEXTROM PARAMETER-NAMES ," Note" ," Velocity" ," Duration"
: GET.#PARAMS ( -- n )
#params
;
: GET.PARAMETER.NAME ( index -- $string )
parameter-names uncount.text
;
METHOD GENERATOR@:
:CLASS OB.VOICE <SUPER OB.JOB
OB.MIDI.INSTRUMENT IO-INSTRUMENT
OB.CHAOTIC_CRITTER IO-NOTE-CRITTER
OB.CHAOTIC_CRITTER IO-VELOCITY-CRITTER
OB.CHAOTIC_CRITTER IO-DURATION-CRITTER
:M GENERATOR@: ( index -- critter_addr )
CASE
0 OF io-note-critter ENDOF
1 OF io-velocity-critter ENDOF
2 OF io-duration-critter ENDOF
ENDCASE
;M
:M PUT.CHANNEL: ( chan# -- )
put.channel: io-instrument
;M
:M GET.CHANNEL: ( -- chan# )
get.channel: io-instrument
;M
:M PRINT: ( -- )
cr name: self cr
." Channel#: " get.channel: io-instrument . cr
;M
: VOICE.FUNCTION ( job_addr -- calculate data and play note )
exec: io-note-critter
exec: io-velocity-critter
exec: io-duration-critter
dup>r \ keep copy of duration
time@ vtime!
note.on.for: io-instrument
r> swap put.duration: []
;
:M NEW: ( 1 -- )
new: super
'c voice.function add: self
\ " NOTE-GENERATOR " put.name: io-note-critter
\ " VELOCITY-GENERATOR " put.name: io-velocity-critter
\ " DURATION-GENERATOR " put.name: io-duration-critter
io-instrument put.instrument: self
0 put.offset: io-instrument
1 put.channel: io-instrument
;M
;CLASS
: MAKE.VOICES ( n -- , instantiate voices and add to list )
dup new: voice-list
0 DO
instantiate ob.voice
1 over new: []
add: voice-list
LOOP
;
: FREE.VOICES ( -- )
many: voice-list 0
DO
I at: voice-list dup
free: []
deinstantiate
LOOP
free: voice-list
;
: PAUSE.VOICES ( -- )
many: voice-list 0
DO
I at: voice-list dup ?executing: []
IF -1 over put.data: [] stop: []
ELSE drop
THEN
LOOP
;
: UNPAUSE.VOICES ( -- )
many: voice-list 0
DO
I at: voice-list dup get.data: []
IF 0 over put.data: [] start: []
ELSE drop
THEN
LOOP
;